package com.zzyl.nursing.config;


import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * Websocket服务端组件类
 *
 * @Author mr.wu
 * @Date 2025-10-29 10:23
 */
@Component
@Slf4j
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

    /**
     * 会话Map,用来存储每个客户端ID对应的会话实例
     */
    private static Map<String, Session> sessionMap = new HashMap<>();


    /**
     * 新建连接时调用的方法
     * @param sid
     * @param session
     */
    @OnOpen
    public void onOpen(@PathParam("sid") String sid, Session session) {
        log.info("新建连接成功，客户端ID：{}",sid);
        sessionMap.put(sid,session);
    }

    /**
     * 关闭连接时调用的方法
     * @param sid
     * @param session
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid, Session session) {
        log.info("关闭连接成功，客户端ID：{}",sid);
        sessionMap.remove(sid);
    }

    /**
     * 出现异常时调用的方法
     * @param sid
     * @param session
     */
    @OnError
    public void onError(@PathParam("sid") String sid, Session session, Throwable throwable) {
        log.error("连接出现问题，客户端ID：{}",sid);
        throwable.printStackTrace();
    }

    /**
     * 客户端发送过来消息时调用的方法
     * @param sid
     * @param session
     */
    @OnMessage
    public void onMessage(@PathParam("sid") String sid, Session session, String message) {
        log.info("收到消息，客户端ID：{}，消息内容：{}",sid, message);
    }

    /**
     * 广播消息到所有的客户端
     * @param message
     */
    public void publishMessage(String sid, String message) {
        Collection<Session> values = sessionMap.values();
        if(!CollectionUtils.isEmpty(values)) {
            values.forEach(x-> {
                try {
                    x.getBasicRemote().sendText(message);
                    log.info("服务端发送消息到客户端成功，客户端ID：{}, 消息内容：{}",sid, message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
    }
}
